﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.SqlClient;

/// <summary>
/// Descripción breve de AccesoDatos
/// </summary>
public static class AccesoDatos
{
    static String rutaBD = "Data Source=localhost;Initial Catalog=ProyectoFinal;Integrated Security=True";

    public static SqlConnection ObtenerConexion()
    {
        SqlConnection cn = new SqlConnection(rutaBD);
        try
        {
            cn.Open();
            return cn;
        }
        catch
        {
            return null;
        }
    }
    static public SqlDataAdapter ObtenerAdaptador(String consultaSql)
    {
        SqlDataAdapter adaptador;
        try
        {
            adaptador=new SqlDataAdapter(consultaSql,rutaBD);
            return adaptador;
        }
        catch
        {
            return null;
        }
    }
    public static DataSet Consulta(string Consulta)
    {
        SqlConnection db = AccesoDatos.ObtenerConexion();
        SqlDataAdapter dbc = AccesoDatos.ObtenerAdaptador(Consulta);

        DataSet ds = new DataSet();
        dbc.Fill(ds);

        return ds;
    }
}
public static class CargarGridView
{
    public static DataSet Sectores()
    {
        return AccesoDatos.Consulta("SELECT * FROM Sectores WHERE Eliminado = 0");
    }
    public static DataSet ConsultarUsuarios()
    {
        SqlConnection db = AccesoDatos.ObtenerConexion();

        string sqlCommand = "SELECT a.Nombre,a.Apellido,a.Email,a.Username,a.Password,a.Rol,b.Sector,a.Interno "+
                            "FROM Usuarios a "+
                            "LEFT JOIN Sectores b ON a.idSector = b.idSector "+
                            "WHERE a.Eliminado = 0"; 

        SqlDataAdapter dbc = AccesoDatos.ObtenerAdaptador(sqlCommand);

        DataSet ds = new DataSet();
        dbc.Fill(ds, "Usuarios");

        return ds;
    }
    public static DataSet ConsultarTicketsUsuario(string Username)
    {
        SqlConnection db = AccesoDatos.ObtenerConexion();

        string sqlCommand = "SELECT a.idTicket, a.Asunto, a.FechaAlta, a.Estado, b.Prioridad, a.Usuario, c.Categoria, a.UsuarioAsignado " +
                            "FROM Tickets a " +
                            "LEFT JOIN Prioridades b ON a.idPrioridad = b.idPrioridad " +
                            "LEFT JOIN Categorias c ON a.idCategoria = c.idCategoria " +
                            "WHERE USUARIO = '" + Username + "' AND Estado <> 'Resuelto' AND Estado <> 'Cerrado'";
        
        SqlDataAdapter dbc = AccesoDatos.ObtenerAdaptador(sqlCommand);

        DataSet ds = new DataSet();
        dbc.Fill(ds, "Tickets");

        return ds;
    }
    public static DataSet ConsultarTicketsAsignadosUsuario(string Username)
    {
        SqlConnection db = AccesoDatos.ObtenerConexion();

        string sqlCommand = "SELECT a.idTicket, a.Asunto, a.FechaAlta, a.Estado, b.Prioridad, a.Usuario, c.Categoria, a.UsuarioAsignado " +
                            "FROM Tickets a " +
                            "LEFT JOIN Prioridades b ON a.idPrioridad = b.idPrioridad " +
                            "LEFT JOIN Categorias c ON a.idCategoria = c.idCategoria " +
                            "WHERE UsuarioAsignado = '" + Username + "' AND Estado <> 'Resuelto' AND Estado <> 'Cerrado'";

        SqlDataAdapter dbc = AccesoDatos.ObtenerAdaptador(sqlCommand);

        DataSet ds = new DataSet();
        dbc.Fill(ds, "Tickets");

        return ds;
    }
    public static DataSet ConsultarTicketsPendientes(string idSector)
    {
        SqlConnection db = AccesoDatos.ObtenerConexion();

        string sqlCommand = "SELECT a.idTicket, a.Asunto, a.FechaAlta, a.Estado, b.Prioridad, a.Usuario, c.Categoria, a.UsuarioAsignado  " +
                            "FROM Tickets a " +
                            "INNER JOIN Prioridades b ON a.idPrioridad = b.idPrioridad "+
                            "INNER JOIN Categorias c ON a.idCategoria = c.idCategoria "+
                            "WHERE a.Estado <> 'Resuelto' AND a.Estado <> 'Cerrado' AND a.UsuarioAsignado IS NULL AND idSector = " + idSector;

        SqlDataAdapter dbc = AccesoDatos.ObtenerAdaptador(sqlCommand);

        DataSet ds = new DataSet();
        dbc.Fill(ds, "Tickets");

        return ds;
    }
}
public static class Consultas
{
    public static DataSet ConsultarUsuarioUsername(string Username)
    {
        SqlConnection db = AccesoDatos.ObtenerConexion();

        string sqlCommand = "SELECT * FROM Usuarios WHERE Eliminado = 0 AND Username = '" + Username + "'";
        SqlDataAdapter dbc = AccesoDatos.ObtenerAdaptador(sqlCommand);

        DataSet ds = new DataSet();
        dbc.Fill(ds, "Usuarios");

        return ds;
    }
    public static Usuario ConsultarUsuario(string Username)
    {
        SqlConnection db = AccesoDatos.ObtenerConexion();

        string sqlCommand = "SELECT * FROM Usuarios WHERE Eliminado = 0 AND Username = '" + Username + "'";
        SqlDataAdapter dbc = AccesoDatos.ObtenerAdaptador(sqlCommand);

        DataSet ds = new DataSet();
        dbc.Fill(ds, "Usuarios");

        string Nombre = ds.Tables[0].Rows[0]["Nombre"].ToString();
        string Apellido = ds.Tables[0].Rows[0]["Apellido"].ToString();
        string Email = ds.Tables[0].Rows[0]["Email"].ToString();
        //string Username = ds.Tables[0].Rows[0]["Username"].ToString();
        string Password = ds.Tables[0].Rows[0]["Username"].ToString();
        string Rol = ds.Tables[0].Rows[0]["Rol"].ToString();
        string Interno = ds.Tables[0].Rows[0]["Interno"].ToString();

        DataSet ds_Sector = AccesoDatos.Consulta("SELECT * FROM Sectores WHERE idSector = " + ds.Tables[0].Rows[0]["idSector"].ToString());

        Sector sector = new Sector();

        sector.idSector = ds_Sector.Tables[0].Rows[0]["idSector"].ToString();
        sector.sector = ds_Sector.Tables[0].Rows[0]["Sector"].ToString();

        Usuario user = new Usuario(Nombre, Apellido, Email, Username, Password, Rol, sector, Interno);
        
        return user;
    }
    public static DataSet ConsultarTicketID(string idTicket)
    {
        SqlConnection db = AccesoDatos.ObtenerConexion();

        string sqlCommand = "SELECT a.idTicket, b.Nombre + ' ' + b.Apellido as Usuario, a.UsuarioAsignado, a.FechaAlta, a.Estado, a.idPrioridad, a.idCategoria, a.Descripcion, a.Asunto " +
                            "FROM Tickets a " + 
                            "LEFT JOIN Usuarios b ON a.Usuario = b.Username " +
                            "WHERE idTicket = '" + idTicket + "'";
        SqlDataAdapter dbc = AccesoDatos.ObtenerAdaptador(sqlCommand);

        DataSet ds = new DataSet();
        dbc.Fill(ds, "Tickets");

        return ds;
    }
    public static DataSet ConsultarComentariosTicketID(string idTicket)
    {
        SqlConnection db = AccesoDatos.ObtenerConexion();

        string sqlCommand = "SELECT b.Nombre + ' ' + b.Apellido as Usuario, a.Fecha, a.Descripcion " + 
                            "FROM Tickets_Det a " +
                            "LEFT JOIN Usuarios b ON a.Usuario = b.Username " + 
                            "WHERE idTicket = '" + idTicket + "'";
        SqlDataAdapter dbc = AccesoDatos.ObtenerAdaptador(sqlCommand);

        DataSet ds = new DataSet();
        dbc.Fill(ds, "Tickets");

        return ds;
    }
}
public static class CargarDDL
{
    public static DataSet ConsultarAdministradoresSector(string idSector)
    {
        SqlConnection db = AccesoDatos.ObtenerConexion();

        string sqlCommand = "SELECT Nombre + ' ' + Apellido as Usuario, Username FROM Usuarios WHERE Eliminado = 0 AND Rol = 'Administrador' AND idSector = " + idSector;
        SqlDataAdapter dbc = AccesoDatos.ObtenerAdaptador(sqlCommand);

        DataSet ds = new DataSet();
        dbc.Fill(ds, "Usuarios");

        return ds;
    }
    public static DataSet ConsultarCategorias()
    {
        SqlConnection db = AccesoDatos.ObtenerConexion();

        string sqlCommand = "SELECT * FROM Categorias WHERE Eliminado = 0";
        SqlDataAdapter dbc = AccesoDatos.ObtenerAdaptador(sqlCommand);

        DataSet ds = new DataSet();
        dbc.Fill(ds, "Categorias");

        return ds;
    }
    public static DataSet ConsultarPrioridades()
    {
        SqlConnection db = AccesoDatos.ObtenerConexion();

        string sqlCommand = "SELECT * FROM Prioridades WHERE Eliminado = 0";
        SqlDataAdapter dbc = AccesoDatos.ObtenerAdaptador(sqlCommand);

        DataSet ds = new DataSet();
        dbc.Fill(ds, "Prioridades");

        return ds;
    }
    public static DataSet ConsultarSectores()
    {
        SqlConnection db = AccesoDatos.ObtenerConexion();

        string sqlCommand = "SELECT * FROM Sectores WHERE Eliminado = 0";
        SqlDataAdapter dbc = AccesoDatos.ObtenerAdaptador(sqlCommand);

        DataSet ds = new DataSet();
        dbc.Fill(ds, "Sectores");

        return ds;
    }
}
public static class GuardarEnBD
{
    #region Tickets
    public static void Ticket(Ticket ticket)
    {
        if (ticket.idTicket == "" || ticket.idTicket == null)
            NuevoTicket(ticket);

        else
            ModificarTicket(ticket);
    }
    public static void NuevoTicket(Ticket ticket)
    {
        SqlConnection db = AccesoDatos.ObtenerConexion();
        SqlCommand cmd = new SqlCommand("Add_Ticket", db);
        cmd.CommandType = CommandType.StoredProcedure;

        SqlParameter idPrioridad = cmd.Parameters.Add("@idPrioridad", SqlDbType.Int);
        idPrioridad.Value = ticket.Prioridad.idPrioridad;

        SqlParameter Estado = cmd.Parameters.Add("@Estado", SqlDbType.NVarChar,100);
        Estado.Value = ticket.Estado;

        SqlParameter Asunto = cmd.Parameters.Add("@Asunto", SqlDbType.NVarChar, 200);
        Asunto.Value = ticket.Asunto;

        SqlParameter Descripcion = cmd.Parameters.Add("@Descripcion", SqlDbType.NVarChar, 2000);
        Descripcion.Value = ticket.Descripcion;

        SqlParameter idCategoria = cmd.Parameters.Add("@idCategoria", SqlDbType.Int);
        idCategoria.Value = ticket.Categoria.idCategoria;

        SqlParameter Usuario = cmd.Parameters.Add("@Usuario", SqlDbType.NVarChar, 100);
        Usuario.Value = ticket.Usuario.Username;

        SqlParameter UsuarioAsignado = cmd.Parameters.Add("@UsuarioAsignado", SqlDbType.NVarChar, 100);
        try
        {
            UsuarioAsignado.Value = ticket.UsuarioAsignado.Username;
        }
        catch
        {
            UsuarioAsignado.Value = DBNull.Value;
        }

        SqlParameter idTicketPadre = cmd.Parameters.Add("@idTicketPadre", SqlDbType.Int);

        if (ticket.idTicketPadre == "")
            idTicketPadre.Value = DBNull.Value;
        else
            idTicketPadre.Value = ticket.idTicketPadre;

        SqlParameter idSector = cmd.Parameters.Add("@idSector", SqlDbType.Int);
        idSector.Value = ticket.Sector.idSector;

        cmd.ExecuteNonQuery();
    }
    private static void ModificarTicket(Ticket ticket)
    {
        SqlConnection db = AccesoDatos.ObtenerConexion();
        SqlCommand cmd = new SqlCommand("Update_Ticket", db);
        cmd.CommandType = CommandType.StoredProcedure;

        SqlParameter idPrioridad = cmd.Parameters.Add("@idPrioridad", SqlDbType.Int);
        idPrioridad.Value = ticket.Prioridad.idPrioridad;

        SqlParameter Estado = cmd.Parameters.Add("@Estado", SqlDbType.NVarChar, 100);
        Estado.Value = ticket.Estado;

        SqlParameter idCategoria = cmd.Parameters.Add("@idCategoria", SqlDbType.Int);
        idCategoria.Value = ticket.Categoria.idCategoria;

        SqlParameter UsuarioAsignado = cmd.Parameters.Add("@UsuarioAsignado", SqlDbType.NVarChar, 100);
        UsuarioAsignado.Value = ticket.UsuarioAsignado.Username;

        SqlParameter idTicket = cmd.Parameters.Add("@idTicket", SqlDbType.Int);
        idTicket.Value = ticket.idTicket;

        cmd.ExecuteNonQuery();
    }
    public static void NuevoComentario(string idT, string Comment, string User)
    {
        SqlConnection db = AccesoDatos.ObtenerConexion();
        SqlCommand cmd = new SqlCommand("Add_Ticket_Det", db);

        cmd.CommandType = CommandType.StoredProcedure;

        SqlParameter idTicket = cmd.Parameters.Add("@idTicket", SqlDbType.Int);
        idTicket.Value = idT;

        SqlParameter Descripcion = cmd.Parameters.Add("@Descripcion", SqlDbType.NVarChar, 100);
        Descripcion.Value = Comment;

        SqlParameter Usuario = cmd.Parameters.Add("@Usuario", SqlDbType.NVarChar, 100);
        Usuario.Value = User;

        cmd.ExecuteNonQuery();
    }
    #endregion
    #region Usuarios
    public static void Usuario(Usuario usuario)
    {
        DataSet ds = Consultas.ConsultarUsuarioUsername(usuario.Username);

        if (ds.Tables[0].Rows.Count == 0 && usuario.Username != "" && usuario.Username != null)
            NuevoUsuario(usuario);
        else
            ModificarUsuario(usuario);
    }
    public static void NuevoUsuario(Usuario usuario)
    {
        SqlConnection db = AccesoDatos.ObtenerConexion();
        SqlCommand cmd = new SqlCommand("Add_Usuario", db);
        cmd.CommandType = CommandType.StoredProcedure;

        SqlParameter Nombre = cmd.Parameters.Add("@Nombre", SqlDbType.NVarChar, 100);
        Nombre.Value = usuario.Nombre;

        SqlParameter Apellido = cmd.Parameters.Add("@Apellido", SqlDbType.NVarChar, 100);
        Apellido.Value = usuario.Apellido;

        SqlParameter Email = cmd.Parameters.Add("@Email", SqlDbType.NVarChar, 100);
        Email.Value = usuario.Email;

        SqlParameter Username = cmd.Parameters.Add("@Username", SqlDbType.NVarChar, 100);
        Username.Value = usuario.Username;

        SqlParameter Password = cmd.Parameters.Add("@Password", SqlDbType.NVarChar, 100);
        Password.Value = usuario.Password;

        SqlParameter Rol = cmd.Parameters.Add("@Rol", SqlDbType.NVarChar, 100);
        Rol.Value = usuario.Rol;

        SqlParameter idSector = cmd.Parameters.Add("@idSector", SqlDbType.Int);
        idSector.Value = usuario.Sector.idSector;

        SqlParameter Interno = cmd.Parameters.Add("@Interno", SqlDbType.NVarChar, 100);
        Interno.Value = usuario.Interno;

        cmd.ExecuteNonQuery();
    }
    public static void NuevaCategoria(Categoria categoria)
    {
        SqlConnection db = AccesoDatos.ObtenerConexion();
        SqlCommand cmd = new SqlCommand("Add_Categoria", db);
        cmd.CommandType = CommandType.StoredProcedure;

        SqlParameter cat = cmd.Parameters.Add("@Categoria", SqlDbType.NVarChar, 100);
        cat.Value = categoria.categoria;

        cmd.ExecuteNonQuery();
    }
    public static void ModificarUsuario(Usuario usuario)
    {
        SqlConnection db = AccesoDatos.ObtenerConexion();
        SqlCommand cmd = new SqlCommand("Update_Usuario", db);
        cmd.CommandType = CommandType.StoredProcedure;

        SqlParameter Nombre = cmd.Parameters.Add("@Nombre", SqlDbType.NVarChar, 100);
        Nombre.Value = usuario.Nombre;

        SqlParameter Apellido = cmd.Parameters.Add("@Apellido", SqlDbType.NVarChar, 100);
        Apellido.Value = usuario.Apellido;

        SqlParameter Email = cmd.Parameters.Add("@Email", SqlDbType.NVarChar, 100);
        Email.Value = usuario.Email;

        SqlParameter Username = cmd.Parameters.Add("@Username", SqlDbType.NVarChar, 100);
        Username.Value = usuario.Username;

        SqlParameter Password = cmd.Parameters.Add("@Password", SqlDbType.NVarChar, 100);
        Password.Value = usuario.Password;

        SqlParameter Rol = cmd.Parameters.Add("@Rol", SqlDbType.NVarChar, 100);
        Rol.Value = usuario.Rol;

        SqlParameter idSector = cmd.Parameters.Add("@idSector", SqlDbType.Int);
        idSector.Value = usuario.Sector.idSector;

        SqlParameter Interno = cmd.Parameters.Add("@Interno", SqlDbType.NVarChar, 100);
        Interno.Value = usuario.Interno;

        cmd.ExecuteNonQuery();
    }
    #endregion
    #region Prioridades
    public static void Prioridad(Prioridad prioridad)
    {
        if (prioridad.idPrioridad == "" || prioridad.idPrioridad == null)
            NuevaPrioridad(prioridad);
        else
            ModificarPrioridad(prioridad);
    }
    public static void NuevaPrioridad(Prioridad prioridad)
    {
        SqlConnection db = AccesoDatos.ObtenerConexion();
        SqlCommand cmd = new SqlCommand("Add_Prioridad", db);
        cmd.CommandType = CommandType.StoredProcedure;

        SqlParameter Prioridad = cmd.Parameters.Add("@Prioridad", SqlDbType.NVarChar, 100);
        Prioridad.Value = prioridad.prioridad;

        cmd.ExecuteNonQuery();
    }
    public static void ModificarPrioridad(Prioridad prioridad)
    {
        SqlConnection db = AccesoDatos.ObtenerConexion();
        SqlCommand cmd = new SqlCommand("Update_Prioridad", db);
        cmd.CommandType = CommandType.StoredProcedure;

        SqlParameter Prioridad = cmd.Parameters.Add("@Prioridad", SqlDbType.Int);
        Prioridad.Value = prioridad.prioridad;

        SqlParameter idPrioridad = cmd.Parameters.Add("@idPrioridad", SqlDbType.Int);
        idPrioridad.Value = prioridad.idPrioridad;

        cmd.ExecuteNonQuery();
    }
    #endregion

    public static void NuevoSector(Sector sector)
    {
        SqlConnection db = AccesoDatos.ObtenerConexion();
        SqlCommand cmd = new SqlCommand("Add_Sector", db);
        cmd.CommandType = CommandType.StoredProcedure;

        SqlParameter Sector = cmd.Parameters.Add("@Sector", SqlDbType.NVarChar, 100);
        Sector.Value = sector.sector;

        cmd.ExecuteNonQuery();
    }
    public static void ModificarSector(Sector sector)
    {
        SqlConnection db = AccesoDatos.ObtenerConexion();
        SqlCommand cmd = new SqlCommand("Update_Sector", db);
        cmd.CommandType = CommandType.StoredProcedure;

        SqlParameter Sector = cmd.Parameters.Add("@Sector", SqlDbType.NVarChar, 100);
        Sector.Value = sector.sector;

        SqlParameter idSector = cmd.Parameters.Add("@idSector", SqlDbType.NVarChar, 100);
        idSector.Value = sector.idSector;

        cmd.ExecuteNonQuery();
    }
    public static void ModificarCategoria(Categoria categoria)
    {
        SqlConnection db = AccesoDatos.ObtenerConexion();
        SqlCommand cmd = new SqlCommand("Update_Sector", db);
        cmd.CommandType = CommandType.StoredProcedure;

        SqlParameter Categoria = cmd.Parameters.Add("@Categoria", SqlDbType.NVarChar, 100);
        Categoria.Value = categoria.categoria;

        SqlParameter idCategoria = cmd.Parameters.Add("@idCategoria", SqlDbType.NVarChar, 100);
        idCategoria.Value = categoria.categoria;

        cmd.ExecuteNonQuery();
    }
}